/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.tcc.view;

import br.com.tcc.dao.DAOContasBancarias;
import br.com.tcc.dao.DAOLancamento;
import br.com.tcc.dao.DAOReceitasDespesas;
import br.com.tcc.item.view.LancamentoItemView;
import br.com.tcc.modelo.ContasBancarias;
import br.com.tcc.modelo.Lancamento;
import br.com.tcc.modelo.ReceitasDespesas;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DatePicker;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;

/**
 * FXML Controller class
 *
 * @author Edidelson
 */
public class LancamentoController implements Initializable, ControlledScreen {

    private ObservableList<LancamentoItemView> list = FXCollections.observableArrayList();
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
    ScreensController myController;
    @FXML
    ComboBox cbConta = new ComboBox();
    @FXML
    ComboBox cbReceitas = new ComboBox();
    @FXML
    TextField txtCodigo = new TextField();
    @FXML
    TextField txtDescricao = new TextField();
    @FXML
    TextField txtValor = new TextField();
    @FXML
    DatePicker dtLancamento = new DatePicker();
    @FXML
    private TableColumn colCodigo;
    @FXML
    private TableColumn colDescricao;
    @FXML
    private TableColumn colValor;
    @FXML
    private TableColumn colConta;
    @FXML
    private TableColumn colTipo;
    @FXML
    private TableColumn colData;
    @FXML
    private TableView tbLancamento;
    private Lancamento lancamento;

    /**
     * Initializes the controller class.
     *
     * @param url
     * @param rb
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        cellColumns();
        iniciar();
    }

    @Override
    public void setScreenParent(ScreensController screenPage) {
        myController = screenPage;
    }

    public void cellColumns() {
        colCodigo.setCellValueFactory(new PropertyValueFactory("codigo"));
        colDescricao.setCellValueFactory(new PropertyValueFactory("descricao"));
        colConta.setCellValueFactory(new PropertyValueFactory("conta"));
        colTipo.setCellValueFactory(new PropertyValueFactory("tipoCota"));
        colValor.setCellValueFactory(new PropertyValueFactory("valor"));
        colData.setCellValueFactory(new PropertyValueFactory("dataLancamento"));
    }

    private void iniciar() {
        tbLancamento.getItems().clear();
        DAOLancamento dao = new DAOLancamento();
        List<Lancamento> lancamentos = dao.getLista();
        lancamentos.stream().map((lanc) -> new LancamentoItemView(lanc)).forEach((itemView) -> {
            tbLancamento.getItems().add(itemView);
        });
        List<ContasBancarias> bancarias = new DAOContasBancarias().getLista();
        cbConta.getItems().clear();
        bancarias.stream().forEach((contasBancarias) -> {
            cbConta.getItems().add(contasBancarias);
        });
        List<ReceitasDespesas> despesas = new DAOReceitasDespesas().getLista();
        cbReceitas.getItems().clear();
        despesas.stream().forEach((receitasDespesas) -> {
            cbReceitas.getItems().add(receitasDespesas);
        });
        dtLancamento.setValue(LocalDate.now()); 
    }

    @FXML
    private void preencherCampos(MouseEvent event) {
        LancamentoItemView itemView = (LancamentoItemView) tbLancamento.getSelectionModel().getSelectedItem();
        if (itemView != null) {

            lancamento = new DAOLancamento().consultar(Integer.parseInt(itemView.getCodigo()));
            lancamento.setCodigo(Integer.parseInt(itemView.getCodigo()));
            lancamento.setDescricao(itemView.getDescricao());
            lancamento.setContasBancarias(itemView.getCodigoConta());
            lancamento.setReceitasDespesas(itemView.getCodigoReceitas());
            try {
                lancamento.setDataLancamento(new Date(dateFormat.parse(itemView.getDataLancamento()).getTime()));
            } catch (ParseException ex) {
                Logger.getLogger(LancamentoController.class.getName()).log(Level.SEVERE, null, ex);
            }
            txtDescricao.setText(itemView.getDescricao());
            txtCodigo.setText(itemView.getCodigo());
            Date date = lancamento.getDataLancamento();
            Instant instant = date.toInstant();
            dtLancamento.setValue(instant.atZone(ZoneId.systemDefault()).toLocalDate());
            cbConta.getSelectionModel().select(itemView.getCodigoConta());
            cbReceitas.getSelectionModel().select(itemView.getCodigoReceitas());
            txtValor.setText(String.valueOf(itemView.getValor())); 
        }
    }

    @FXML
    private void adicionar(ActionEvent event) {
        if (lancamento == null) {
            lancamento = new Lancamento();
            lancamento.setContasBancarias((ContasBancarias) cbConta.getSelectionModel().getSelectedItem());
            lancamento.setReceitasDespesas((ReceitasDespesas) cbReceitas.getSelectionModel().getSelectedItem());
            // ?
            LocalDate ld = dtLancamento.getValue();
            Calendar c = Calendar.getInstance();
            c.set(ld.getYear(), ld.getMonthValue()-1, ld.getDayOfMonth());
            System.out.println(c.getTime());
            lancamento.setDataLancamento(c.getTime());
            lancamento.setValorLancamento(Double.parseDouble(txtValor.getText().replace(",", ".")));
            lancamento.setDescricao(txtDescricao.getText());
            DAOLancamento dao = new DAOLancamento();
            dao.adicionar(lancamento);
            iniciar();
            limpar();
        }
    }

    @FXML
    private void alterar(ActionEvent event) {
        if (lancamento != null) {
            lancamento.setContasBancarias((ContasBancarias) cbConta.getSelectionModel().getSelectedItem());
            lancamento.setReceitasDespesas((ReceitasDespesas) cbReceitas.getSelectionModel().getSelectedItem());
            LocalDate ld = dtLancamento.getValue();
            Calendar c = Calendar.getInstance();
            c.set(ld.getYear(), ld.getMonthValue()-1, ld.getDayOfMonth());
            lancamento.setDataLancamento(c.getTime());
            lancamento.setValorLancamento(Double.parseDouble(txtValor.getText().replace(",", ".")));
            lancamento.setDescricao(txtDescricao.getText());
            DAOLancamento dao = new DAOLancamento();
            dao.adicionar(lancamento);
            iniciar();
            limpar();
        }
    }

    @FXML
    private void remover(ActionEvent event) {
        if (lancamento != null) {
            DAOLancamento dao = new DAOLancamento();
            dao.remover(lancamento);
            iniciar();
            limpar();
        }
    }

    public void limpar() {
        txtCodigo.setText("");
        txtDescricao.setText("");
        txtValor.setText("");
        cbConta.getSelectionModel().select(0);
        cbReceitas.getSelectionModel().select(0);
        dtLancamento.setValue(LocalDate.now());
        lancamento = null;
    }
}
